package es.analisis.algoritmos;

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.Collections;
import java.util.List;
import java.util.Random;
import java.util.StringTokenizer;

class ListaObjetos {
	
	private List<Objeto> lista; // Lista de objetos que tenemos
	private int pesoMax; // Peso maximo de la mochila

	public ListaObjetos() {
		super();
		lista = new ArrayList<Objeto>();
		pesoMax = 0;
	}

	public List<Objeto> getLista() {
		return lista;
	}

	public void setLista(List<Objeto> lista) {
		this.lista = lista;
	}
	
	public int getPesoMax() {
		return pesoMax;
	}

	public void setPesoMax(int pesoMax) {
		this.pesoMax = pesoMax;
	}

	public int tam(){
		return lista.size();
	}
	
	public void generarInstancia(String fileName, int n){
	
		FileWriter fichero;
		PrintWriter pw;
		
		try {
			fichero = new FileWriter(fileName);
			pw = new PrintWriter(fichero);
			
			pw.println(n);
			
			// Generamos n objetos con un valor y peso aleatorios
			for(int i = 0; i < n; i++){
				Random r = new Random();
				int valorNuevo = r.nextInt(100)+1;
				int pesoNuevo = r.nextInt(10)+1;
				pesoMax += pesoNuevo;
				
				Objeto nuevo = new Objeto(i, pesoNuevo, valorNuevo);
				lista.add(nuevo);
			}
			
			// Como peso maximo de la mochila ponemos el 60% del peso total del todos los objetos
			pesoMax *= 0.7;
			pw.println(pesoMax);
			for(int i = 0; i < n; i++){
				Integer valor = lista.get(i).getValor();
				Integer peso = lista.get(i).getPeso();
				pw.println(valor.toString()+" "+ peso.toString());
			}
			
			if(fichero != null)
				fichero.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	
	public void cargarInstancia(String fileName){
		File archivo;
		FileReader fr;
		BufferedReader br;
		int n = 0;
		
		try {
			archivo = new File(fileName);
			fr = new FileReader(archivo);
			br = new BufferedReader(fr);
			n = new Integer(br.readLine());
			pesoMax = new Integer(br.readLine());
			String linea;
			int id = 1;
			int valor;
			int peso;
			while ((linea = br.readLine()) != null){
			
				StringTokenizer tokens = new StringTokenizer(linea, " ");
				valor = Integer.valueOf(tokens.nextToken());
				peso = Integer.valueOf(tokens.nextToken());
							
				Objeto o = new Objeto(id, peso, valor);
				lista.add(o);
				id++;
			}
			
			if(fr != null)
				fr.close();
		} catch (NumberFormatException | IOException e) { // TODO Auto-generated catch block
			e.printStackTrace();
		}

    }
	
	public void ordenar(){
		Collections.sort(lista, new Comparator<Objeto>() {
			@Override
			public int compare(Objeto o1, Objeto o2) {
				return new Double(o2.getValorPeso()).compareTo( o1.getValorPeso());
			}
		});
	}
	
	@Override
	public String toString() {
		return "ListaElementos [lista=" + lista + "]";
	}

    public ListaObjetos copiar(){
        ListaObjetos nueva = new ListaObjetos();

        List<Objeto> lista = new ArrayList();
        for(Objeto x: this.getLista()){
            Objeto y = x.clone();
            lista.add(y);
        }
        nueva.setLista(lista);
        nueva.setPesoMax(this.getPesoMax());
        return nueva;
    }

}
